#ifndef __GGEAR_LIST_H
#define __GGEAR_LIST_H

namespace ggear
{
	namespace glb
	{
		template<class _Tx>
		class List
		{
		public:
			//Default constructor
			List(){}

			//Destructor
			virtual ~List(){}

			//Check whether list is empty
			virtual bool Empty() const = 0;

			//Return number of elements in current list
			virtual u32 Count() const = 0;

			//Return value of element at specified position
			virtual const _Tx& Get(u32 _pos) const = 0;

			//Set value of element at specified position
			virtual void Set(const _Tx& _val, u32 _pos) = 0;

			//Insert new element at specified position in current list
			virtual void Insert(const _Tx& _val, u32 _pos) = 0;

			//Add new element to front of array list
			virtual void PushFront(const _Tx& _val) = 0;

			//Add new element to the end of array list
			virtual void PushBack(const _Tx& _val) = 0;

			//Delete an element at specified position in current list
			virtual void Remove(u32 _pos) = 0;

			//Delete the first member of current array list
			virtual void PopFront() = 0;

			//Delete the last member of current array list
			virtual void PopBack() = 0;
			
			//Delete all element inside current list
			virtual void Clear() = 0;

			//Swap value between 2 elements inside current list
			virtual void Swap(u32 _lpos, u32 _rpos) = 0;
		};
	}
}

#endif